package com.sudoctor.controller;


import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.sudoctor.bean.BusquedaGeolocalizacionBean;
import com.sudoctor.bean.BusquedaSencillaBean;
import com.sudoctor.bean.DatosBusquedaBean;
import com.sudoctor.bean.Pagina;
import com.sudoctor.entity.HorarioInmueble;
import com.sudoctor.entity.Inmueble;
import com.sudoctor.entity.Telefono;
import com.sudoctor.form.BusquedaAvanzadaForm;
import com.sudoctor.form.BusquedaGeolocalizacionForm;
import com.sudoctor.form.BusquedaSencillaForm;
import com.sudoctor.service.InmuebleService;
import com.sudoctor.util.JsonComponentes;
import com.sudoctor.util.TipoServicio;
import com.sudoctor.util.Transformer;

@Controller
// @RequestMapping("/home") Mapping que sirve para agregar un nivel a la url:
// http://localhost:8080/sudoctor/home/pagina.html
public class BuscadorController
{

	protected static Logger logger = Logger.getLogger("BuscadorController");
	
	//Variable que establece el numero de resultados por pagina.
	private final static int RESULTADO_POR_PAGINA = 10;
	
	//Variable de session que almacena el total de los resultados.
	private final static String SESSION_TOTAL = "total";
	
	//Variable de session que almacena el objeto busquedaSencillaBean.
	private final static String SESSION_OBJ_BUSQUEDA_SENCILLA = "objBusquedaSencillaBean";
	
	//Variable de session que almacena el objeto busquedaGeolocalizacionBean.
	private final static String SESSION_OBJ_BUSQUEDA_GEOLOCALIZACION = "busquedaGeolocalizacionBean";

	@Autowired
	InmuebleService inmueble;
	
	
	
	
	/**
	 * Metodo para inicializar la pagina inicial
	 * @param busquedaSencilla
	 *            .- Form de la busqueda principal
	 * @param busquedaAvanzada
	 *            .- Form de la busqueda avanzada
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String paginaInicial(@ModelAttribute("busquedaSencillaForm") BusquedaSencillaForm busquedaSencilla, @ModelAttribute("busquedaAvanzadaForm") BusquedaAvanzadaForm busquedaAvanzada, Map<String, Object> model)
	{

		logger.info("Entro a paginaInicial()");

		//Se inicializa el formulario sencillo.
		model.put("busquedaSencillaForm", new BusquedaSencillaForm());

		//Se inicializa el formaulario avanazado.
		model.put("busquedaAvanzadaForm", new BusquedaAvanzadaForm());

		return "index";
	}
	
	/**
	 * Metodo que es llamado cuando se da clic en la paginación.
	 * @param pagina.- Numero de pagina
	 * @param descripcion.- Descripcion
	 * @param model.- Modelo para subir datos.
	 * @param tiposervicio.- Valores que contiene el path {tiposervicio}
	 * @param lugar.- Valor que contiene el path {lugar} -> estado-municipio
	 * @param especialidad.- Valor que contiene el path {especialidad}
	 * @param request.- request
	 * @param session.- session
	 * @return
	 */
	@RequestMapping(value = "siguiente/{tiposervicio}/{lugar}/{especialidad}.html", method = RequestMethod.GET)
	public String paginacion(
			@RequestParam(value="page") int pagina,
			@RequestParam(value="descripcion") String descripcion,
			Map<String, Object> model,
			@PathVariable int tiposervicio,
			@PathVariable String lugar,
			@PathVariable String especialidad,
			HttpServletRequest request,
			HttpSession session
			)
	{
		
		logger.info("entro al metodo paginacion()");
		
		//TODO: Falta validar datos
		
		//Se crea el bean y se llena con los datos proporcionados de la busqueda.
		BusquedaSencillaBean objBusquedaSencillaBean = new BusquedaSencillaBean();
		objBusquedaSencillaBean.setTipoServicio(tiposervicio);
		objBusquedaSencillaBean.setLugar(lugar);
		objBusquedaSencillaBean.setEspecialidad(especialidad);
		objBusquedaSencillaBean.setDescripcion(descripcion);
		
		convertirLugar(objBusquedaSencillaBean);
		
		//Se obtiene de session el bean de tipo BusquedaSencillaBean
		BusquedaSencillaBean objBusquedaSencillaBeanSession = (BusquedaSencillaBean) session.getAttribute(SESSION_OBJ_BUSQUEDA_SENCILLA);
		
		int total = 0;
		
		//Si existe en sesion
		if(objBusquedaSencillaBeanSession != null)
		{
			if(objBusquedaSencillaBean.equals(objBusquedaSencillaBeanSession))
			{
				 total = (Integer) session.getAttribute(SESSION_TOTAL);
			}else{
				total = inmueble.obtenerTotal(objBusquedaSencillaBean);
				
				//Subir a session el nuevo total
				request.getSession().setAttribute(SESSION_TOTAL, total);
				
				//Subir a session el objBusquedaSencilla
				request.getSession().setAttribute(SESSION_OBJ_BUSQUEDA_SENCILLA, objBusquedaSencillaBean);
			}
		}else{
			//Sino existe en sesion
			total = inmueble.obtenerTotal(objBusquedaSencillaBean);
			
			//Subir a session el nuevo total
			request.getSession().setAttribute(SESSION_TOTAL, total);
			
			//Subir a session el objBusquedaSencilla
			request.getSession().setAttribute(SESSION_OBJ_BUSQUEDA_SENCILLA, objBusquedaSencillaBean);
		}
		
		DatosBusquedaBean objDatosBusqueda = new DatosBusquedaBean();
		List<Inmueble> lstResultado = new ArrayList<Inmueble>();
		
		if(total > 0)
		{
			lstResultado = inmueble.obtenerListaInmuebles(objBusquedaSencillaBean,pagina,RESULTADO_POR_PAGINA);
			logger.info("Tiene resultados");
		}
		
		String jsonLocalidades = convertirJson(lstResultado);
		objDatosBusqueda.setLstResultado(lstResultado);
		objDatosBusqueda.setJsonLocalidades(jsonLocalidades);
		objDatosBusqueda.setTipoServicio(objBusquedaSencillaBean.getTipoServicio());
		objDatosBusqueda.setLugar(objBusquedaSencillaBean.getLugar());
		objDatosBusqueda.setEspecialidad(objBusquedaSencillaBean.getEspecialidad());
		objDatosBusqueda.setDescripcion(objBusquedaSencillaBean.getDescripcion());
		objDatosBusqueda.setBasePaginacionURL("");
		objDatosBusqueda.setUrlImagenes("../../../");
		Pagina<Inmueble> objPagina = new Pagina<Inmueble>(pagina,RESULTADO_POR_PAGINA,total);
		objDatosBusqueda.setPagina(pagina);
		objDatosBusqueda.setObjPagina(objPagina);

		model.put("objDatosBusqueda", objDatosBusqueda);
		
		return "resultado";

	}
	
	
	/**
	 * Metodo para realizar la busqueda principal
	 * @param busquedaSencillaForm
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/busquedaSencilla.html", method = RequestMethod.GET)
	public String busquedaSencilla(
			@ModelAttribute("busquedaSencillaForm") BusquedaSencillaForm busquedaSencillaForm, 
			Map<String, Object> model,
			HttpServletRequest request,
			HttpSession session
			)
	{

		logger.info("entro al metodo busquedaSencilla()");

		String pagina = "";

		String error = validaFormularioBusquedaSencilla(busquedaSencillaForm);

		if (error.trim().equals(""))
		{
			pagina = "resultado";
			
			Transformer objTransformerFormToBean = new Transformer();
			
			BusquedaSencillaBean objBusquedaSencillaBean = new BusquedaSencillaBean();
			
			objTransformerFormToBean.transformerFormToBean(busquedaSencillaForm, objBusquedaSencillaBean);

			//Separa el estado del municipio.
			convertirLugar(objBusquedaSencillaBean);
			
			//Se obtiene de sesion el objeto BusquedaSencillaBean
			BusquedaSencillaBean objBusquedaSencillaBeanSession = (BusquedaSencillaBean) session.getAttribute(SESSION_OBJ_BUSQUEDA_SENCILLA);
			
			int total = 0;
			
			if(objBusquedaSencillaBeanSession != null)
			{
				if(objBusquedaSencillaBean.equals(objBusquedaSencillaBeanSession))
				{
					 total = (Integer) session.getAttribute(SESSION_TOTAL);
				}else{
					
					total = inmueble.obtenerTotal(objBusquedaSencillaBean);
					
					//Subir a sesion el nuevo total
					request.getSession().setAttribute(SESSION_TOTAL, total);
					
					//Subir a sesion el objBusquedaSencilla
					request.getSession().setAttribute(SESSION_OBJ_BUSQUEDA_SENCILLA, objBusquedaSencillaBean);
				}
				
			}else{
				total = inmueble.obtenerTotal(objBusquedaSencillaBean);
				
				//Subir a session el nuevo total
				request.getSession().setAttribute(SESSION_TOTAL, total);
				
				//Subir a session el objBusquedaSencilla
				request.getSession().setAttribute(SESSION_OBJ_BUSQUEDA_SENCILLA, objBusquedaSencillaBean);
			}
			
			List<Inmueble> lstResultado = new ArrayList<Inmueble>();
			
			if(total > 0)
			{
				lstResultado = inmueble.obtenerListaInmuebles(objBusquedaSencillaBean,1,RESULTADO_POR_PAGINA);
			}
			
			Pagina<Inmueble> objPagina = new Pagina<Inmueble>(1,RESULTADO_POR_PAGINA,total);
			
			String jsonLocalidades = convertirJson(lstResultado);
			
			//Bean que se utiliza en la jsp
			DatosBusquedaBean objDatosBusqueda = new DatosBusquedaBean();
			
			objDatosBusqueda.setLstResultado(lstResultado);
			objDatosBusqueda.setObjPagina(objPagina);
			objDatosBusqueda.setTipoServicio(objBusquedaSencillaBean.getTipoServicio());
			objDatosBusqueda.setLugar(objBusquedaSencillaBean.getLugar());
			objDatosBusqueda.setEspecialidad(objBusquedaSencillaBean.getEspecialidad());
			objDatosBusqueda.setDescripcion(objBusquedaSencillaBean.getDescripcion());
			objDatosBusqueda.setBasePaginacionURL("/siguiente");
			objDatosBusqueda.setUrlImagenes("");
			objDatosBusqueda.setJsonLocalidades(jsonLocalidades);
			objDatosBusqueda.setPagina(1);
			

			model.put("objDatosBusqueda", objDatosBusqueda);	
			
		} else
		{
			model.put("mensajeError", error);
			model.put("busquedaAvanzadaForm", new BusquedaAvanzadaForm());
			
			pagina = "index";
		}
		
		return pagina;

	}
	

	

	
	/**
	 * Metodo para crear un json con las coordenadas para colocarlos en el mapa de la lista de resultados.
	 * @param lstResultado
	 * @return
	 */
	public String convertirJson(List<Inmueble> lstResultado){
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("{");
		
			sb.append("\"lugares\" : [");
			
				if(lstResultado != null && lstResultado.size() > 0)
				{
					for(int i = 0; i < lstResultado.size(); i++)
					{
						sb.append("{");
						sb.append("\"indice\" : \""+lstResultado.get(i).getIndice()+"\"");
						sb.append(",");
						sb.append("\"titulo\" : \""+lstResultado.get(i).getObjUnidadNegocio().getDescripcion()+"\"");
						sb.append(",");
						sb.append("\"latitud\" : \""+lstResultado.get(i).getLatitud()+"\"");
						sb.append(",");
						sb.append("\"longitud\" : \""+lstResultado.get(i).getLongitud()+"\"");
						
						if(lstResultado.size() == (i+1))
						{
							sb.append("}");
						}else{
							sb.append("},");
						}
						
						
					}
				}

			sb.append("]");
		
		sb.append("}");
		
		return sb.toString();
	}
	
	/**
	 * Metodo para crear un json con las coordenadas para colocarlos en el mapa del detalle.
	 * @param objInmueble
	 * @return
	 */
	public String convertirJson(Inmueble objInmueble){
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("{");
		
			sb.append("\"lugares\" : [");

					sb.append("{");
					sb.append("\"titulo\" : \""+objInmueble.getObjUnidadNegocio().getDescripcion()+"\"");
					sb.append(",");
					sb.append("\"latitud\" : \""+objInmueble.getLatitud()+"\"");
					sb.append(",");
					sb.append("\"longitud\" : \""+objInmueble.getLongitud()+"\"");
					sb.append("}");



			sb.append("]");
		
		sb.append("}");
		
		return sb.toString();
	}


	/**
	 * Metodo para validar formulario de busqueda sencilla
	 * @param objBusquedaSencillaForm
	 * @return
	 */
	public String validaFormularioBusquedaSencilla(BusquedaSencillaForm objBusquedaSencillaForm)
	{

		String error = "";

			if (objBusquedaSencillaForm.getLugar() != null)
			{
					TipoServicio enumTipoServicio = TipoServicio.getServicio(objBusquedaSencillaForm.getTipoServicio());

					if(enumTipoServicio != null)
					{
						switch (enumTipoServicio)
						{
							case CONSULTORIOS:
								// Validar Especialidad
								break;
							case FARMACIAS:
		
								break;
							case LABORATORIOS:
		
								break;
							case HOSPITALES_CLINICAS:
								// Validar Especialidad
								break;
						}
	
						String arreglo[] = objBusquedaSencillaForm.getLugar().split("-");
	
						if (error.trim().equals("") && arreglo.length != 2)
						{
							// Error seleccion un lugar valido
							error = "Seleccione un lugar valido.";
						}
					
					}else{
						error = "Seleccione un tipo de servicio valido.";
					}

			} else
			{
				// Error seleccionar tipo de servicio
				error = "Seleccione un lugar.";
			}

		return error;

	}

	/**
	 * Metodo para convertir el lugar en estado y municipio
	 * @param objBusquedaSencillaBean
	 */
	public void convertirLugar(BusquedaSencillaBean objBusquedaSencillaBean)
	{

		String strLugar [] = objBusquedaSencillaBean.getLugar().split("-");
		
		objBusquedaSencillaBean.setIdEstado(new Integer(strLugar[0]));
		objBusquedaSencillaBean.setIdMunicipio(new Integer(strLugar[1]));

	}
	
	/**
	 * Metodo para ver el detalle de una farmacia
	 * @param model
	 * @param id
	 * @param nombre
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "farmacias/{id}/{nombre}.html", method = RequestMethod.GET)
	public String detalleFarmacia(Map<String, Object> model,@PathVariable String id,@PathVariable String nombre,
			HttpServletRequest request,	HttpSession session)
	{
		
		String inmuebleId = id.split("-")[1];
		String inmuebleTipoInmuebleId = id.split("-")[0];
		
		Inmueble objInmueble = inmueble.detalleInmueble(new Integer(inmuebleId), TipoServicio.FARMACIAS.getTipo());
		List<HorarioInmueble> lstHorarios = inmueble.detalleHorario(new Integer(inmuebleTipoInmuebleId));
		List<Telefono> lstTelefonos = inmueble.detalleTelefonos(new Integer(inmuebleTipoInmuebleId));
		String jsonData = convertirJson(objInmueble);
		
		model.put("objInmueble", objInmueble);
		model.put("lstHorarios", lstHorarios);
		model.put("lstTelefonos", lstTelefonos);
		model.put("urlImagenes", "../../");
		model.put("jsonData", jsonData);
		
		return "detalleFarmacia";
	}
	
	/**
	 * Metodo para ver el detalle de un laboratorio
	 * @param model
	 * @param id
	 * @param nombre
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "laboratorios/{id}/{nombre}.html", method = RequestMethod.GET)
	public String detalleLaboratorio(Map<String, Object> model,@PathVariable String id,@PathVariable String nombre,
			HttpServletRequest request,	HttpSession session)
	{
		
		String inmuebleId = id.split("-")[1];
		String inmuebleTipoInmuebleId = id.split("-")[0];
		
		Inmueble objInmueble = inmueble.detalleInmueble(new Integer(inmuebleId), TipoServicio.LABORATORIOS.getTipo());
		List<HorarioInmueble> lstHorarios = inmueble.detalleHorario(new Integer(inmuebleTipoInmuebleId));
		List<Telefono> lstTelefonos = inmueble.detalleTelefonos(new Integer(inmuebleTipoInmuebleId));
		String jsonData = convertirJson(objInmueble);
		
		model.put("objInmueble", objInmueble);
		model.put("lstHorarios", lstHorarios);
		model.put("lstTelefonos", lstTelefonos);
		model.put("urlImagenes", "../../");
		model.put("jsonData", jsonData);
		
		return "detalleLaboratorio";
	}
	
	/**
	 * Metodo para ver el detalle de un Hospital/Clinica
	 * @param model
	 * @param id
	 * @param nombre
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "hospitales/{id}/{nombre}.html", method = RequestMethod.GET)
	public String detalleHospital(Map<String, Object> model,@PathVariable String id,@PathVariable String nombre,
			HttpServletRequest request,	HttpSession session)
	{
		
		String inmuebleId = id.split("-")[1];
		String inmuebleTipoInmuebleId = id.split("-")[0];
		
		Inmueble objInmueble = inmueble.detalleInmueble(new Integer(inmuebleId), TipoServicio.HOSPITALES_CLINICAS.getTipo());
		List<HorarioInmueble> lstHorarios = inmueble.detalleHorario(new Integer(inmuebleTipoInmuebleId));
		List<Telefono> lstTelefonos = inmueble.detalleTelefonos(new Integer(inmuebleTipoInmuebleId));
		String jsonData = convertirJson(objInmueble);
		
		model.put("objInmueble", objInmueble);
		model.put("lstHorarios", lstHorarios);
		model.put("lstTelefonos", lstTelefonos);
		model.put("urlImagenes", "../../");
		model.put("jsonData", jsonData);
		
		return "detalleHospital";
	}
	
	/**
	 * Metodo para ver el detalle de consultorios
	 * @param model
	 * @param id
	 * @param nombre
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "consultorios/{id}/{nombre}.html", method = RequestMethod.GET)
	public String detalleConsultorio(Map<String, Object> model,@PathVariable String id,@PathVariable String nombre,
			HttpServletRequest request,	HttpSession session)
	{
		
		String inmuebleId = id.split("-")[1];
		String inmuebleTipoInmuebleId = id.split("-")[0];
		
		Inmueble objInmueble = inmueble.detalleInmueble(new Integer(inmuebleId), TipoServicio.CONSULTORIOS.getTipo());
		List<HorarioInmueble> lstHorarios = inmueble.detalleHorario(new Integer(inmuebleTipoInmuebleId));
		List<Telefono> lstTelefonos = inmueble.detalleTelefonos(new Integer(inmuebleTipoInmuebleId));
		String jsonData = convertirJson(objInmueble);
		
		model.put("objInmueble", objInmueble);
		model.put("lstHorarios", lstHorarios);
		model.put("lstTelefonos", lstTelefonos);
		model.put("urlImagenes", "../../");
		model.put("jsonData", jsonData);
		
		return "detalleConsultorio";
	}
	
	/**
	 * Metodo para crear un json de especialidades, mostrado en el autocompletado de la pagina inicial.
	 * @return
	 */
	@RequestMapping(value = "/src/especialidades.json", method = RequestMethod.POST)
	public ResponseEntity<String> especialidades(){
		
		String especialidades = JsonComponentes.especialidades();
		
		HttpHeaders responseHeaders = new HttpHeaders();
		responseHeaders.add("Content-Type", "application/json; charset=utf-8");
		return new ResponseEntity<String>(especialidades, responseHeaders, HttpStatus.CREATED);
	
	}
	
	
	/**
	 * Metodo para crear el json de los lugares, usado en la pagina principal.
	 * @return
	 */
	@RequestMapping(value = "/src/pcs.json", method = RequestMethod.POST)
	public ResponseEntity<String> lugares()
	{
		String jsonLugares = JsonComponentes.lugares();
		  
		HttpHeaders responseHeaders = new HttpHeaders();
		responseHeaders.add("Content-Type", "application/json; charset=utf-8");
		return new ResponseEntity<String>(jsonLugares, responseHeaders, HttpStatus.CREATED);
	}
	
	
	/**
	 * Metodo para crear un json de horarios al dar clic en la pestaña de horario, en la lista de resultados.
	 * @return
	 */
	@RequestMapping(value = "/src/horario.html", method = RequestMethod.GET)
	public ResponseEntity<String> horario(@RequestParam(value="id") int inmuebleTipoInmuebleId){
		
		List<HorarioInmueble> lstHorarios = inmueble.detalleHorario(new Integer(inmuebleTipoInmuebleId));
		
		String horarioHtml = convertirHorarioHtml(lstHorarios);
		
		HttpHeaders responseHeaders = new HttpHeaders();
		responseHeaders.add("Content-Type", "text/html; charset=utf-8");
		return new ResponseEntity<String>(horarioHtml, responseHeaders, HttpStatus.CREATED);
	
	}
	
	
	/**
	 * Metodo para crear un json con las coordenadas para colocarlos en el mapa de la lista de resultados.
	 * @param lstResultado
	 * @return
	 */
	public String convertirHorarioHtml(List<HorarioInmueble> lstHorarios){
		
		StringBuffer sb = new StringBuffer();
	
			if(lstHorarios != null && lstHorarios.size() > 0)
			{
				
				//Logica para acomodar el horario.
				int dia = 0;
				
				sb.append("<div style=\"margin-left:20px;height:100%;\">");
				
				for(int i = 0; i < lstHorarios.size(); i++)
				{
					
					if(i > 0 && lstHorarios.get(i).getObjDia().getId() == dia)
					{
						sb.append(" y ");
					}
					
					if(i > 0 && lstHorarios.get(i).getObjDia().getId() != dia)
					{
						sb.append("</div>");//Cierra div que contiene al div dia
					}
					
					if(lstHorarios.get(i).getObjDia().getId() != dia)
					{
						sb.append("<div style=\"margin-bottom:7px;\"><div style=\"display:inline-block;width:60px;font-weight:bold;padding-right:30px;\">");
						sb.append(lstHorarios.get(i).getObjDia().getDescripcion());
						sb.append("</div> ");
					}
					
					sb.append(lstHorarios.get(i).getHoraInicio() +" - "+ lstHorarios.get(i).getHoraFinal());
					
					if(lstHorarios.size() == i+1)
					{
						sb.append("</div>");//Cierra div que contiene al div dia
					}
					
					dia = lstHorarios.get(i).getObjDia().getId();
				}
				
				sb.append("</div>");
			}

		
		return sb.toString();
	}
	
	
	
	/**
	 * Metodo de prueba para Abraham.
	 * @return
	 */
	@RequestMapping(value = "/src/tipoServicio.json", method = RequestMethod.GET)
	public ResponseEntity<String> tipoServicioTest() {

	  String servicios = "[ { \"value\": 10 , \"text\": \"Hospital y/o Clinica\"},   { \"value\": 4 , \"text\": \"Laboratorio\"},   { \"value\": 5 , \"text\": \"Farmacia\"},   { \"value\": 3 , \"text\": \"Consultorio\"} ]";
	  
	  HttpHeaders responseHeaders = new HttpHeaders();
	  responseHeaders.add("Content-Type", "application/json; charset=utf-8");
	  return new ResponseEntity<String>(servicios, responseHeaders, HttpStatus.CREATED);
	  
	}
	
	/**
	 * Metodo de prueba para abraham
	 * @return
	 */
	@RequestMapping(value = "/src/especialidades.json", method = RequestMethod.GET)
	public ResponseEntity<String> especialidadesTest(){
		
		String especialidades = JsonComponentes.especialidades();
		
		HttpHeaders responseHeaders = new HttpHeaders();
		responseHeaders.add("Content-Type", "application/json; charset=utf-8");
		return new ResponseEntity<String>(especialidades, responseHeaders, HttpStatus.CREATED);
	
	}
	
	/**
	 * Metodo de prueba para abraham
	 * @return
	 */
	@RequestMapping(value = "/src/listaInmuebles.json", method = RequestMethod.GET)
	public ResponseEntity<String> inmueblesTest(){
		
		BusquedaSencillaBean objBusquedaSencillaBean = new BusquedaSencillaBean();
		objBusquedaSencillaBean.setIdEstado(19);
		objBusquedaSencillaBean.setIdMunicipio(39);
		objBusquedaSencillaBean.setTipoServicio(10);
		objBusquedaSencillaBean.setDescripcion("");
		
		
		List<Inmueble> lstResultado = inmueble.obtenerListaInmuebles(objBusquedaSencillaBean,1,RESULTADO_POR_PAGINA);
		
		String json = convertirJson(lstResultado);
		
		HttpHeaders responseHeaders = new HttpHeaders();
		responseHeaders.add("Content-Type", "application/json; charset=utf-8");
		return new ResponseEntity<String>(json, responseHeaders, HttpStatus.CREATED);
	
	}
	
	
	/**
	 * Metodo para inicializar pagina de busqueda avanzada
	 * @param busquedaAvanzadaForm
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/busquedaAvanzada", method = RequestMethod.GET)
	public String busquedaAvanzada(Map<String, Object> model)
	{

		logger.info("entro al metodo busquedaAvanzada()");
		
		model.put("busquedaAvanzadaForm", new BusquedaAvanzadaForm());
		
		return "busquedaAvanzada";

	}
	
	/**
	 * Metodo para realizar la busqueda avanzada
	 * @param busquedaAvanzadaForm
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/busquedaAvanzada", method = RequestMethod.POST)
	public String busquedaAvanzadaSubmit(@ModelAttribute("busquedaAvanzadaForm") BusquedaAvanzadaForm busquedaAvanzadaForm, Map<String, Object> model)
	{

		logger.info("entro al metodo busquedaAvanzadaSubmit()");
		
		//Validar campos obligatorios
		
		//
		
		return "busquedaAvanzada";

	}
	
	/**
	 * Metodo para validar formulario de busqueda avanzada
	 * @param objBusquedaAvanzadaForm
	 */
	public void validaFormularioBusquedaAvanzada(BusquedaAvanzadaForm objBusquedaAvanzadaForm)
	{

		if (objBusquedaAvanzadaForm.getTipoServicio() != 0)
		{

			TipoServicio enumTipoServicio = TipoServicio.getServicio(objBusquedaAvanzadaForm.getTipoServicio());

			switch (enumTipoServicio)
			{
			case CONSULTORIOS:

				break;
			case FARMACIAS:

				break;
			case LABORATORIOS:

				break;
			case HOSPITALES_CLINICAS:

				break;

			default:
				break;
			}

		}

	}
	
	
	
	
	
	/**
	 * Metodo para inicializar pagina de geolocalizacion
	 * @param busquedaAvanzadaForm
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/busquedaGeolocalizacion", method = RequestMethod.GET)
	public String inicializaBusquedaGeolocalizacion(Map<String, Object> model)
	{

		logger.info("entro al metodo busquedaGeolocalizacion()");
		
		model.put("busquedaGeolocalizacionForm", new BusquedaGeolocalizacionForm());
		
		return "busquedaGeolocalizacion";

	}
	
	/**
	 * Metodo para inicializar pagina de geolocalizacion
	 * @param busquedaAvanzadaForm
	 * @param model
	 * @return
	 */
	@RequestMapping(value = "/busquedaGeolocalizacion", method = RequestMethod.POST)
	public String busquedaGeolocalizacion(@ModelAttribute("busquedaGeolocalizacionForm") BusquedaGeolocalizacionForm busquedaGeolocalizacionForm, 
			Map<String, Object> model,
			HttpServletRequest request,
			HttpSession session)
	{

		logger.info("entro al metodo busquedaGeolocalizacion()");
		
		String pagina = "";
		
		Transformer objTransformerFormToBean = new Transformer();
		
		BusquedaGeolocalizacionBean objBusquedaGeolocalizacionBean = new BusquedaGeolocalizacionBean();
		
		objTransformerFormToBean.transformerFormToBean(busquedaGeolocalizacionForm, objBusquedaGeolocalizacionBean);
		
		//Se obtiene de sesion el objeto BusquedaSencillaBean
		BusquedaGeolocalizacionBean objBusquedaGeolocalizacionBeanSession = (BusquedaGeolocalizacionBean) session.getAttribute(SESSION_OBJ_BUSQUEDA_GEOLOCALIZACION);
		
		
		
		int total = 0;
		
		if(objBusquedaGeolocalizacionBeanSession != null)
		{
			if(objBusquedaGeolocalizacionBean.equals(objBusquedaGeolocalizacionBeanSession))//TODO:Pendiente sobreescribir metodo equal
			{
				 total = (Integer) session.getAttribute(SESSION_TOTAL);//TODO: Total deberia estar en el bean, ya que se puede tener en sesion busquedaSencilla, Avanzada o Geolocalizacion.
			}else{
				
				total = inmueble.obtenerTotal(objBusquedaGeolocalizacionBean);
				
				//Subir a sesion el nuevo total
				request.getSession().setAttribute(SESSION_TOTAL, total);
				
				//Subir a sesion el objBusquedaSencilla
				request.getSession().setAttribute(SESSION_OBJ_BUSQUEDA_GEOLOCALIZACION, objBusquedaGeolocalizacionBean);
			}
			
		}else{
			total = inmueble.obtenerTotal(objBusquedaGeolocalizacionBean);
			
			//Subir a session el nuevo total
			request.getSession().setAttribute(SESSION_TOTAL, total);
			
			//Subir a session el objBusquedaSencilla
			request.getSession().setAttribute(SESSION_OBJ_BUSQUEDA_GEOLOCALIZACION, objBusquedaGeolocalizacionBean);
		}
		
		List<Inmueble> lstResultado = new ArrayList<Inmueble>();
		
		if(total > 0)
		{
			lstResultado = inmueble.obtenerListaGeolocalizacion(objBusquedaGeolocalizacionBean,1,RESULTADO_POR_PAGINA);
		}
		
		Pagina<Inmueble> objPagina = new Pagina<Inmueble>(1,RESULTADO_POR_PAGINA,total);
		
		String jsonLocalidades = convertirJson(lstResultado);
		
		//Bean que se utiliza en la jsp
		DatosBusquedaBean objDatosBusqueda = new DatosBusquedaBean();
		
		objDatosBusqueda.setLstResultado(lstResultado);
		objDatosBusqueda.setObjPagina(objPagina);
		objDatosBusqueda.setTipoServicio(objBusquedaGeolocalizacionBean.getUnidadNegocio());
		objDatosBusqueda.setDescripcion(objBusquedaGeolocalizacionBean.getDescripcion());
		objDatosBusqueda.setBasePaginacionURL("/siguiente");
		objDatosBusqueda.setUrlImagenes("");
		objDatosBusqueda.setJsonLocalidades(jsonLocalidades);
		objDatosBusqueda.setPagina(1);
		

		model.put("objDatosBusqueda", objDatosBusqueda);
		
		pagina = "resultado";
		
		
		return pagina;

	}
	

}
